/**
 * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
 */
package com.scs.application.core.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.net.URLDecoder;
import cn.hutool.core.net.URLEncodeUtil;
import cn.hutool.core.util.CharsetUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringEscapeUtils;

import java.io.UnsupportedEncodingException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串工具类, 继承org.apache.commons.lang3.StringUtils类
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils {

    private static final char SEPARATOR = '_';
    private static final String CHARSET_NAME = "UTF-8";

    /**
     * 转换为字节数组
     * @param str
     * @return
     */
    public static byte[] getBytes(String str){
    	if (str != null){
    		try {
				return str.getBytes(CHARSET_NAME);
			} catch (UnsupportedEncodingException e) {
				return null;
			}
    	}else{
    		return null;
    	}
    }

    /**
     * 字节数组转换为字符串
     * @param bytes
     * @return
     */
    public static String toString(byte[] bytes){
    	try {
			return new String(bytes, CHARSET_NAME);
		} catch (UnsupportedEncodingException e) {
			return EMPTY;
		}
    }

    /**
     * 是否包含字符串
     * @param str 验证字符串
     * @param strs 字符串组
     * @return 包含返回true
     */
    public static boolean inString(String str, String... strs){
    	if (str != null && strs != null){
        	for (String s : strs){
        		if (str.equals(trim(s))){
        			return true;
        		}
        	}
    	}
    	return false;
    }

    /**
     * 是否包含字符串
     * @param str 验证字符串
     * @param strs 字符串组
     * @return 包含返回true
     */
    public static boolean inStringIgnoreCase(String str, String... strs){
    	if (str != null && strs != null){
        	for (String s : strs){
        		if (str.equalsIgnoreCase(trim(s))){
        			return true;
        		}
        	}
    	}
    	return false;
    }

	/**
	 * 替换掉HTML标签方法
	 */
	public static String stripHtml(String html) {
		if (isBlank(html)){
			return "";
		}
		//html.replaceAll("\\&[a-zA-Z]{0,9};", "").replaceAll("<[^>]*>", "");
		String regEx = "<.+?>";
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(html);
		String s = m.replaceAll("");
		return s;
	}

	/**
	 * 替换为手机识别的HTML，去掉样式及属性，保留回车。
	 * @param html
	 * @return
	 */
	public static String toMobileHtml(String html){
		if (html == null){
			return "";
		}
		return html.replaceAll("<([a-z]+?)\\s+?.*?>", "<$1>");
	}

	/**
	 * 对txt进行HTML编码，并将\n转换为&gt;br/&lt;、\t转换为&nbsp; &nbsp;
	 * @param txt
	 * @return
	 */
	public static String toHtml(String txt){
		if (txt == null){
			return "";
		}
		return replace(replace(Encodes.escapeHtml(trim(txt)), "\n", "<br/>"), "\t", "&nbsp; &nbsp; ");
	}

	/**
	 * 缩略字符串（不区分中英文字符）
	 * @param str 目标字符串
	 * @param length 截取长度
	 * @return
	 */
	public static String abbr(String str, int length) {
		if (str == null) {
			return "";
		}
		try {
			StringBuilder sb = new StringBuilder();
			int currentLength = 0;
			for (char c : stripHtml(StringEscapeUtils.unescapeHtml4(str)).toCharArray()) {
				currentLength += String.valueOf(c).getBytes("GBK").length;
				if (currentLength <= length - 3) {
					sb.append(c);
				} else {
					sb.append("...");
					break;
				}
			}
			return sb.toString();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return "";
	}

	// 缩略字符串替换Html正则表达式预编译
	private static Pattern p1 = Pattern.compile("<([a-zA-Z]+)[^<>]*>");

	/**
	 * 缩略字符串（适应于与HTML标签的）
	 * @param param 目标字符串
	 * @param length 截取长度
	 * @return
	 */
	public static String htmlAbbr(String param, int length) {
		if (param == null) {
			return "";
		}
		StringBuffer result = new StringBuffer();
		int n = 0;
		char temp;
		boolean isCode = false; // 是不是HTML代码
		boolean isHTML = false; // 是不是HTML特殊字符,如&nbsp;
		for (int i = 0; i < param.length(); i++) {
			temp = param.charAt(i);
			if (temp == '<') {
				isCode = true;
			} else if (temp == '&') {
				isHTML = true;
			} else if (temp == '>' && isCode) {
				n = n - 1;
				isCode = false;
			} else if (temp == ';' && isHTML) {
				isHTML = false;
			}
			try {
				if (!isCode && !isHTML) {
					n += String.valueOf(temp).getBytes("GBK").length;
				}
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}

			if (n <= length - 3) {
				result.append(temp);
			} else {
				result.append("...");
				break;
			}
		}
		// 取出截取字符串中的HTML标记
		String tempResult = result.toString().replaceAll("(>)[^<>]*(<?)", "$1$2");
		// 去掉不需要结素标记的HTML标记
		tempResult = tempResult.replaceAll("</?(AREA|BASE|BASEFONT|BODY|BR|COL|COLGROUP|DD|DT|FRAME|HEAD|HR|"
				+ "HTML|IMG|INPUT|ISINDEX|LI|LINK|META|OPTION|P|PARAM|TBODY|TD|TFOOT|TH|THEAD|TR|area|base|"
				+ "basefont|body|br|col|colgroup|dd|dt|frame|head|hr|html|img|input|isindex|li|link|meta|"
				+ "option|p|param|tbody|td|tfoot|th|thead|tr)[^<>]*/?>", "");
		// 去掉成对的HTML标记
		tempResult = tempResult.replaceAll("<([a-zA-Z]+)[^<>]*>(.*?)</\\1>", "$2");
		// 用正则表达式取出标记
		Matcher m = p1.matcher(tempResult);
		List<String> endHTML = Lists.newArrayList();
		while (m.find()) {
			endHTML.add(m.group(1));
		}
		// 补全不成对的HTML标记
		for (int i = endHTML.size() - 1; i >= 0; i--) {
			result.append("</");
			result.append(endHTML.get(i));
			result.append(">");
		}
		return result.toString();
	}

	/**
	 * 首字母大写
	 */
	public static String cap(String str){
		return capitalize(str);
	}

	/**
	 * 首字母小写
	 */
	public static String uncap(String str){
		return uncapitalize(str);
	}

	/**
	 * 驼峰命名法工具
	 * @return
	 * 		camelCase("hello_world") == "helloWorld"
	 * 		capCamelCase("hello_world") == "HelloWorld"
	 * 		uncamelCase("helloWorld") = "hello_world"
	 */
    public static String camelCase(String s) {
        if (s == null) {
            return null;
        }

        s = s.toLowerCase();

        StringBuilder sb = new StringBuilder(s.length());
        boolean upperCase = false;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            if (c == SEPARATOR) {
                upperCase = true;
            } else if (upperCase) {
                sb.append(Character.toUpperCase(c));
                upperCase = false;
            } else {
                sb.append(c);
            }
        }

        return sb.toString();
    }

    /**
	 * 驼峰命名法工具
	 * @return
	 * 		camelCase("hello_world") == "helloWorld"
	 * 		capCamelCase("hello_world") == "HelloWorld"
	 * 		uncamelCase("helloWorld") = "hello_world"
	 */
    public static String capCamelCase(String s) {
        if (s == null) {
            return null;
        }
        s = camelCase(s);
        return s.substring(0, 1).toUpperCase() + s.substring(1);
    }

    /**
	 * 驼峰命名法工具
	 * @return
	 * 		camelCase("hello_world") == "helloWorld"
	 * 		capCamelCase("hello_world") == "HelloWorld"
	 * 		uncamelCase("helloWorld") = "hello_world"
	 */
    public static String uncamelCase(String s) {
        if (s == null) {
            return null;
        }

        StringBuilder sb = new StringBuilder();
        boolean upperCase = false;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            boolean nextUpperCase = true;

            if (i < (s.length() - 1)) {
                nextUpperCase = Character.isUpperCase(s.charAt(i + 1));
            }

            if ((i > 0) && Character.isUpperCase(c)) {
                if (!upperCase || !nextUpperCase) {
                    sb.append(SEPARATOR);
                }
                upperCase = true;
            } else {
                upperCase = false;
            }

            sb.append(Character.toLowerCase(c));
        }

        return sb.toString();
    }

    /**
     * 转换为JS获取对象值，生成三目运算返回结果
     * @param objectString 对象串
     *   例如：row.user.id
     *   返回：!row?'':!row.user?'':!row.user.id?'':row.user.id
     */
    public static String jsGetVal(String objectString){
    	StringBuilder result = new StringBuilder();
    	StringBuilder val = new StringBuilder();
    	String[] vals = split(objectString, ".");
    	for (int i=0; i<vals.length; i++){
    		val.append("." + vals[i]);
    		result.append("!"+(val.substring(1))+"?'':");
    	}
    	result.append(val.substring(1));
    	return result.toString();
    }

	/**
	 * 获取随机字符串
	 * @param count
	 * @return
	 */
	public static String getRandomStr(int count) {
		char[] codeSeq = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
				'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
				'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
		Random random = new Random();
		StringBuilder s = new StringBuilder();
		for (int i = 0; i < count; i++) {
			String r = String.valueOf(codeSeq[random.nextInt(codeSeq.length)]);
			s.append(r);
		}
		return s.toString();
	}

	/**
	 * 获取随机数字
	 * @param count
	 * @return
	 */
	public static String getRandomNum(int count) {
		char[] codeSeq = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
		Random random = new Random();
		StringBuilder s = new StringBuilder();
		for (int i = 0; i < count; i++) {
			String r = String.valueOf(codeSeq[random.nextInt(codeSeq.length)]);
			s.append(r);
		}
		return s.toString();
	}


    public static String getRandomChinese(int count) {
        String simplified  = "䌽锕锿皑嗳蔼霭爱嫒碍暧瑷谙鹌埯铵肮鳌袄媪岙奥骜钯坝罢鲅摆呗败颁坂板钣办绊帮绑谤镑龅宝饱鸨报铇鲍鹎贝狈备钡惫辈鞴贲锛绷绷镚鲾笔币毕闭诐哔荜毙铋筚赑滗跸边笾编鳊贬变缏辩辫标飑骉骠镖飙飚镳表鳔鳖别瘪宾傧滨缤槟镔濒摈殡膑髌鬓饼禀并并拨剥袯钵饽驳钹铂鹁馎鲌镈钸卜补钚财采采参骖残蚕惭惨黪灿仓伧沧苍鸧舱册侧厕恻测层馇锸镲诧钗侪虿觇掺搀婵谗禅馋缠蝉镡产产刬浐谄铲阐蒇冁忏颤伥阊锠鲳长肠苌尝偿鲿厂场怅玚畅钞车砗彻尘陈谌碜闯衬称龀榇谶柽蛏铛赪撑枨诚铖惩骋鸱痴驰迟齿耻饬炽冲冲虫宠铳俦帱绸畴筹踌雠丑刍厨锄雏橱蹰础储处绌触传钏囱疮创怆锤纯莼莼鹑绰辍龊词辞鹚鹚赐从苁枞葱骢聪丛凑辏撺镩蹿窜缞鹾锉错哒达荙跶鞑轪绐带贷单担郸殚瘅箪胆掸诞弹惮当当珰裆筜挡党谠凼砀垱荡荡档鱽导岛捣祷焘盗锝灯邓镫镝籴敌涤觌诋递谛缔颠巅癫点电垫钿淀鲷钓调铞绖谍叠鲽钉顶订饤锭丢铥东岽鸫动冻栋胨斗钭饾窦阇读渎椟牍犊黩独笃赌镀断缎煅锻簖队对兑怼镦吨趸炖钝顿夺铎缍亸饳堕讹锇鹅额轭垩恶饿谔阏腭锷鹗颚鳄鳄儿鸸鲕尔迩饵铒贰发发罚阀珐矾钒烦饭范贩钫鲂访纺飞绯鲱诽废费镄纷坟豮奋偾愤粪鲼丰风沣枫疯砜锋冯缝讽凤赗肤麸凫绂绋韨辐幞呒抚辅讣妇负驸复复赋缚鲋赙鳆钆该赅钙盖干杆尴秆赶鳡绀赣冈刚岗纲钢戆缟镐诰锆纥鸽搁阁镉个铬给亘赓鹒绠鲠宫龚巩唝贡沟钩钩缑构诟购够觏轱鸪毂鹘诂谷钴蛊馉鹄顾锢鲴刮鸹剐诖挂关观鳏馆贯惯掼鹳广犷归妫龟规闺硅鲑轨匦诡刽刿柜贵鳜衮绲辊滚鲧呙埚锅蝈国帼掴馃椁过铪骇顸韩汉闬颔绗颃号颢灏诃阂饸龁颌阖鲄鹖贺鹤恒鸻横轰红纮闳荭鸿黉讧糇后鲎鲘轷胡胡壶鹕浒户护沪鹱鳠华哗骅铧划画话桦婳怀坏欢还环锾阛缳镮缓奂唤换涣焕痪鲩黄锽鳇谎诙咴挥袆晖珲辉汇汇会讳哕浍绘荟诲桧烩贿秽缋阓毁荤阍浑馄诨锪伙钬货获获祸镬讥击叽饥机玑矶鸡迹积绩缉赍赍跻齑羁级极辑鹡几虮挤鱾计记纪际剂哜济继觊蓟霁鲚鲫骥夹浃镓郏荚铗蛱颊贾钾槚价驾戋奸坚歼间艰监笺缄缣鲣鹣鞯鳒拣枧俭茧捡笕减检睑硷裥锏简谫戬碱见饯剑荐贱涧舰渐谏溅践鉴键槛姜将浆螀缰鳉讲奖桨蒋绛酱娇浇骄胶鲛鹪侥挢绞饺矫脚铰搅缴峤轿较阶疖节讦杰诘洁结颉鲒届诫仅卺紧谨锦馑尽尽劲进荩晋烬赆缙觐泾经茎荆惊鲸刭颈净弪径迳胫痉竞靓静镜颎纠鸠阄旧厩鹫驹锔举榉龃讵钜剧惧据飓锯窭屦鹃镌锩桊绢隽决诀珏绝觉谲镢镢军钧皲鲪馂骏咔开锎凯剀垲恺闿铠锴忾龛阚闶钪铐鲓轲疴钶颏颗壳克课骒缂锞垦恳硁铿抠眍库绔喾裤夸块侩郐哙狯脍鲙宽髋诓诳邝圹纩况旷矿贶亏岿窥骙匮愦溃蒉馈篑聩裈锟鹍鲲阃壸扩阔腊蜡镴来崃徕涞莱梾铼赉睐赖濑癞籁兰岚拦栏阑蓝谰澜褴斓篮镧览揽缆榄漤懒烂滥锒阆捞劳唠崂痨铹铑涝耢乐鳓饹缧镭诔垒泪类厘离骊鹂漓缡蓠鲡篱礼里里逦锂鲤鳢历历厉丽励呖坜沥苈枥疠隶俪栎疬轹郦栗砺砾莅粝蛎跞雳俩奁连帘怜涟莲梿联裢鲢镰敛琏脸裣蔹练娈炼恋殓链潋凉辌粮两唡魉谅辆辽疗缭镣鹩钌猎邻临辚鳞凛廪懔檩赁蔺躏灵岭凌铃鸰棂绫龄鲮领刘浏馏骝飗镏鹠镠绺锍鹨龙咙泷茏昽栊珑胧眬砻笼聋陇垄垅拢娄偻喽蒌楼耧蝼髅嵝搂篓瘘镂噜撸卢庐芦垆泸炉栌胪轳鸬舻颅鲈卤卤虏掳鲁橹镥陆录赂辂渌禄滤箓辘鹭氇驴闾榈吕侣稆铝屡缕褛虑绿孪峦挛栾鸾脔滦銮乱锊抡仑伦囵沦纶轮论罗猡脶萝逻椤锣箩骡镙泺络荦骆妈嬷马犸玛码蚂杩骂骂唛吗买荬劢迈麦卖脉颟蛮馒瞒鳗满螨谩缦镘猫牦锚铆贸么么没镅鹛霉镁门扪钔闷焖懑们鹲锰梦弥祢猕谜芈觅幂谧绵黾缅腼面鹋缈庙灭珉缗闵闽悯愍鳘鸣铭谬缪谟馍殁蓦镆谋亩钼镎内纳钠难馕挠铙蛲垴恼脑闹讷呐馁铌鲵拟腻鲇鲶捻辇撵酿鸟茑袅陧聂啮嗫镊镍颞蹑蘖宁咛拧狞柠聍泞纽钮农侬哝浓脓秾驽钕疟傩诺锘讴欧殴瓯鸥呕怄沤盘蹒庞鳑抛狍疱赔锫辔喷鹏纰铍鲏罴骈谝骗缥飘贫嫔频颦评凭苹鲆钋泼颇酦钷颒仆扑铺镤朴谱镨凄栖桤齐脐颀骐骑蛴锜蕲鲯鳍岂启启绮气讫弃荠碛扦迁佥钎牵悭铅谦签骞鹐荨钤钱钳潜浅肷谴缱堑椠呛戗枪玱跄锖锵镪强墙墙嫱蔷樯抢羟襁炝硗跷锹缲乔侨荞桥谯鞒诮窍翘窃惬箧锲亲钦骎嵚锓寝吣揿氢轻倾鲭苘顷请庆穷茕琼鳅虬赇巯区岖诎驱躯趋鸲癯龋阒觑权诠辁铨鳈颧绻劝却悫确阕阙鹊让荛饶桡扰娆绕热认讱纫纴轫韧饪驲绒荣嵘蝾镕铷颥缛软锐闰润洒钑飒萨鳃赛叁毵伞糁馓颡丧骚缫鳋扫涩啬铯穑杀纱刹铩鲨筛晒删姗钐闪陕讪骟缮赡鳝伤殇觞垧赏绱烧绍赊舍厍设慑摄滠绅诜鲹沈审谂婶肾渗瘆声胜渑绳圣尸师诗鸤狮湿酾鲺时识实蚀埘莳鲥驶势视试饰贳适轼铈弑谥释寿兽绶书纾枢摅输赎术树竖数帅闩双骦鹴谁税顺说说烁铄硕纟丝咝鸶缌蛳飔厮锶饲驷松怂耸讼诵颂馊飕锼擞薮苏稣诉肃骕谡鹔虽绥随岁谇孙狲荪损笋缩唢琐锁铊獭鳎挞闼阘骀台台台鲐态钛贪啴摊滩瘫坛昙谈锬谭钽叹赕汤铴镗饧傥烫涛绦绦韬梼绹鼗讨铽腾誊锑绨缇鹈题鳀体屉阗觍条龆鲦粜铫贴铁厅听烃铤颋铜鲖统恸头秃图涂钍团抟颓蜕饨鲀讬饦脱驮驼鸵鼍椭萚箨洼娲袜腽弯湾纨顽挽绾万网辋鳂为为韦围帏沩违闱涠维潍伟伪伪纬苇炜玮诿韪鲔卫硙谓猬温辒鳁纹闻阌稳问鹟瓮挝涡莴窝蜗卧龌乌污邬呜诬钨无吴芜鹀坞妩庑怃鹉务误骛雾鹜诶饻牺锡习袭觋鳛玺铣戏屃系系饩细郄绤阋虾侠峡狭硖辖吓厦纤籼莶铦跹锨鲜闲闲贤咸挦娴衔痫鹇狝显险崄猃蚬藓县岘苋现线线宪馅羡献乡芗厢缃骧镶详响饷飨鲞项枭哓骁绡鸮萧销潇箫蟏嚣晓啸蝎协胁挟谐携撷缬写泻绁亵谢锌衅兴骍陉钘铏讻汹诇鸺馐绣锈锈须须顼虚谞嘘许诩叙绪续溆轩谖悬选癣绚铉镟学泶鸴鳕谑勋勋埙寻驯询浔鲟训讯逊压鸦桠鸭哑痖亚讶垭娅挜氩恹烟阉讠闫严盐阎颜颜兖俨厣魇黡鼹厌觃彦砚艳验谚滟酽谳餍赝鸯扬阳旸杨炀疡钖飏养痒样尧肴峣轺窑谣摇遥瑶飖鳐药鹞爷铘业叶页邺晔烨谒馌靥医祎铱鹥仪诒饴贻遗颐钇舣蚁义亿忆艺议异呓译峄怿绎诣驿轶谊勚缢瘗镒鹝鹢镱阴荫骃铟银龂龈饮隐瘾应莺婴绬锳嘤撄缨罂樱璎鹦鹰茔荥荧莹萤营萦滢蓥潆蝇赢颍颕颖瘿哟佣拥痈镛鳙颙咏涌踊鲬优忧犹邮莜莸铀游鱿鲉铕诱纡于欤鱼娱谀馀渔嵛觎舆与伛屿俣语铻龉驭吁妪饫郁狱钰预谕阈御鹆滪蓣誉鹬鸢鸳渊鹓贠员园圆缘鼋辕橼远愿约岳钥悦钺阅跃粤赟云匀纭芸郧氲陨殒运郓恽晕酝愠缊韫韵蕴臜杂灾载攒趱暂赞錾瓒赃驵脏脏凿枣灶则择泽责啧帻箦赜贼鲗谮缯锃赠揸齄扎札轧闸铡鲊鲝诈栅斋债毡谵鹯鳣斩飐盏崭辗战栈绽骣张涨帐胀账钊诏赵辄蛰谪辙锗这鹧贞针侦浈桢祯诊轸缜阵纼鸩赈镇争征峥挣狰钲睁铮筝证诤郑帧症织栀执职絷踯只只纸轵志制帜质栉挚致贽轾掷铚鸷滞骘觯踬终钟钟肿种众众诌诪辀鸼赒轴纣绉昼荮皱骤诛诸猪铢槠潴橥烛属嘱瞩伫纻苎注贮驻筑铸专砖颛转啭赚馔妆庄桩装壮状骓锥坠缀缒赘谆准浊诼镯兹赀资缁谘辎锱镃龇鲻渍眦综骔踪总偬纵邹驺诹鲰镞诅组躜缵钻鳟";
        String traditional = "綵錒鎄皚噯藹靄愛嬡礙曖璦諳鵪垵銨骯鰲襖媼嶴奧驁鈀壩罷鮁擺唄敗頒阪闆鈑辦絆幫綁謗鎊齙寶飽鴇報鉋鮑鵯貝狽備鋇憊輩韝賁錛繃綳鏰鰏筆幣畢閉詖嗶蓽斃鉍篳贔潷蹕邊籩編鯿貶變緶辯辮標颮驫驃鏢飆飈鑣錶鰾鱉別癟賓儐濱繽檳鑌瀕擯殯臏髕鬢餅稟並併撥剝襏缽餑駁鈸鉑鵓餺鮊鎛鈽蔔補鈈財採埰參驂殘蠶慚慘黲燦倉傖滄蒼鶬艙冊側廁惻測層餷鍤鑔詫釵儕蠆覘摻攙嬋讒禪饞纏蟬鐔產産剗滻諂鏟闡蕆囅懺顫倀閶錩鯧長腸萇嘗償鱨廠場悵瑒暢鈔車硨徹塵陳諶磣闖襯稱齔櫬讖檉蟶鐺赬撐棖誠鋮懲騁鴟癡馳遲齒恥飭熾沖衝蟲寵銃儔幬綢疇籌躊讎醜芻廚鋤雛櫥躕礎儲處絀觸傳釧囪瘡創愴錘純蓴蒓鶉綽輟齪詞辭鶿鷀賜從蓯樅蔥驄聰叢湊輳攛鑹躥竄縗鹺銼錯噠達薘躂韃軑紿帶貸單擔鄲殫癉簞膽撣誕彈憚當噹璫襠簹擋黨讜氹碭壋蕩盪檔魛導島搗禱燾盜鍀燈鄧鐙鏑糴敵滌覿詆遞諦締顛巔癲點電墊鈿澱鯛釣調銱絰諜疊鰈釘頂訂飣錠丟銩東崠鶇動凍棟腖鬥鈄餖竇闍讀瀆櫝牘犢黷獨篤賭鍍斷緞煆鍛籪隊對兌懟鐓噸躉燉鈍頓奪鐸綞嚲飿墮訛鋨鵝額軛堊惡餓諤閼齶鍔鶚顎鱷鰐兒鴯鮞爾邇餌鉺貳發髮罰閥琺礬釩煩飯範販鈁魴訪紡飛緋鯡誹廢費鐨紛墳豶奮僨憤糞鱝豐風灃楓瘋碸鋒馮縫諷鳳賵膚麩鳧紱紼韍輻襆嘸撫輔訃婦負駙復複賦縛鮒賻鰒釓該賅鈣蓋幹桿尷稈趕鱤紺贛岡剛崗綱鋼戇縞鎬誥鋯紇鴿擱閣鎘個鉻給亙賡鶊綆鯁宮龔鞏嗊貢溝鉤鈎緱構詬購夠覯軲鴣轂鶻詁穀鈷蠱餶鵠顧錮鯝颳鴰剮詿掛關觀鰥館貫慣摜鸛廣獷歸媯龜規閨矽鮭軌匭詭劊劌櫃貴鱖袞緄輥滾鯀咼堝鍋蟈國幗摑餜槨過鉿駭頇韓漢閈頷絎頏號顥灝訶閡餄齕頜闔魺鶡賀鶴恆鴴橫轟紅紘閎葒鴻黌訌餱後鱟鮜軤衚鬍壺鶘滸戶護滬鸌鱯華嘩驊鏵劃畫話樺嫿懷壞歡還環鍰闤繯鐶緩奐喚換渙煥瘓鯇黃鍠鰉謊詼噅揮褘暉琿輝匯彙會諱噦澮繪薈誨檜燴賄穢繢闠毀葷閽渾餛諢鍃夥鈥貨獲穫禍鑊譏擊嘰饑機璣磯雞跡積績緝齎賫躋齏羈級極輯鶺幾蟣擠魢計記紀際劑嚌濟繼覬薊霽鱭鯽驥夾浹鎵郟莢鋏蛺頰賈鉀檟價駕戔姦堅殲間艱監箋緘縑鰹鶼韉鰜揀梘儉繭撿筧減檢瞼鹼襇鐧簡譾戩堿見餞劍薦賤澗艦漸諫濺踐鑒鍵檻薑將漿螿韁鱂講獎槳蔣絳醬嬌澆驕膠鮫鷦僥撟絞餃矯腳鉸攪繳嶠轎較階癤節訐傑詰潔結頡鮚屆誡僅巹緊謹錦饉儘盡勁進藎晉燼贐縉覲涇經莖荊驚鯨剄頸凈弳徑逕脛痙競靚靜鏡熲糾鳩鬮舊廄鷲駒鋦舉櫸齟詎鉅劇懼據颶鋸窶屨鵑鐫錈棬絹雋決訣玨絕覺譎钁鐝軍鈞皸鮶餕駿哢開鐦凱剴塏愷闓鎧鍇愾龕闞閌鈧銬鮳軻痾鈳頦顆殼剋課騍緙錁墾懇硜鏗摳瞘庫絝嚳褲誇塊儈鄶噲獪膾鱠寬髖誆誑鄺壙纊況曠礦貺虧巋窺騤匱憒潰蕢饋簣聵褌錕鶤鯤閫壼擴闊臘蠟鑞來崍徠淶萊棶錸賚睞賴瀨癩籟蘭嵐攔欄闌藍讕瀾襤斕籃鑭覽攬纜欖灠懶爛濫鋃閬撈勞嘮嶗癆鐒銠澇耮樂鰳餎縲鐳誄壘淚類釐離驪鸝灕縭蘺鱺籬禮裡裏邐鋰鯉鱧歷曆厲麗勵嚦壢瀝藶櫪癘隸儷櫟癧轢酈慄礪礫蒞糲蠣躒靂倆奩連簾憐漣蓮槤聯褳鰱鐮斂璉臉襝蘞練孌煉戀殮鏈瀲涼輬糧兩啢魎諒輛遼療繚鐐鷯釕獵鄰臨轔鱗凜廩懍檁賃藺躪靈嶺淩鈴鴒欞綾齡鯪領劉瀏餾騮飀鎦鶹鏐綹鋶鷚龍嚨瀧蘢曨櫳瓏朧矓礱籠聾隴壟壠攏婁僂嘍蔞樓耬螻髏嶁摟簍瘺鏤嚕擼盧廬蘆壚瀘爐櫨臚轤鸕艫顱鱸鹵滷虜擄魯櫓鑥陸錄賂輅淥祿濾籙轆鷺氌驢閭櫚呂侶穭鋁屢縷褸慮綠孿巒攣欒鸞臠灤鑾亂鋝掄侖倫圇淪綸輪論羅玀腡蘿邏欏鑼籮騾鏍濼絡犖駱媽嬤馬獁瑪碼螞榪罵駡嘜嗎買蕒勱邁麥賣脈顢蠻饅瞞鰻滿蟎謾縵鏝貓氂錨鉚貿麽麼沒鎇鶥黴鎂門捫鍆悶燜懣們鸏錳夢彌禰獼謎羋覓冪謐綿黽緬靦麵鶓緲廟滅瑉緡閔閩憫湣鰵鳴銘謬繆謨饃歿驀鏌謀畝鉬鎿內納鈉難饢撓鐃蟯堖惱腦鬧訥吶餒鈮鯢擬膩鮎鯰撚輦攆釀鳥蔦裊隉聶嚙囁鑷鎳顳躡櫱寧嚀擰獰檸聹濘紐鈕農儂噥濃膿穠駑釹瘧儺諾鍩謳歐毆甌鷗嘔慪漚盤蹣龐鰟拋麅皰賠錇轡噴鵬紕鈹鮍羆駢諞騙縹飄貧嬪頻顰評憑蘋鮃釙潑頗醱鉕頮僕撲鋪鏷樸譜鐠淒棲榿齊臍頎騏騎蠐錡蘄鯕鰭豈啟啓綺氣訖棄薺磧扡遷僉釺牽慳鉛謙簽騫鵮蕁鈐錢鉗潛淺膁譴繾塹槧嗆戧槍瑲蹌錆鏘鏹強牆墻嬙薔檣搶羥繈熗磽蹺鍬繰喬僑蕎橋譙鞽誚竅翹竊愜篋鍥親欽駸嶔鋟寢唚撳氫輕傾鯖檾頃請慶窮煢瓊鰍虯賕巰區嶇詘驅軀趨鴝臒齲闃覷權詮輇銓鰁顴綣勸卻愨確闋闕鵲讓蕘饒橈擾嬈繞熱認訒紉紝軔韌飪馹絨榮嶸蠑鎔銣顬縟軟銳閏潤灑鈒颯薩鰓賽叄毿傘糝饊顙喪騷繅鰠掃澀嗇銫穡殺紗剎鎩鯊篩曬刪姍釤閃陝訕騸繕贍鱔傷殤觴坰賞緔燒紹賒捨厙設懾攝灄紳詵鯵瀋審諗嬸腎滲瘮聲勝澠繩聖屍師詩鳲獅濕釃鯴時識實蝕塒蒔鰣駛勢視試飾貰適軾鈰弒謚釋壽獸綬書紓樞攄輸贖術樹豎數帥閂雙驦鸘誰稅順說説爍鑠碩糹絲噝鷥緦螄颸廝鍶飼駟鬆慫聳訟誦頌餿颼鎪擻藪蘇穌訴肅驌謖鷫雖綏隨歲誶孫猻蓀損筍縮嗩瑣鎖鉈獺鰨撻闥闒駘臺檯颱鮐態鈦貪嘽攤灘癱壇曇談錟譚鉭嘆賧湯鐋鏜餳儻燙濤絛縧韜檮綯鞀討鋱騰謄銻綈緹鵜題鯷體屜闐覥條齠鰷糶銚貼鐵廳聽烴鋌頲銅鮦統慟頭禿圖塗釷團摶頹蛻飩魨託飥脫馱駝鴕鼉橢蘀籜窪媧襪膃彎灣紈頑輓綰萬網輞鰃為爲韋圍幃溈違闈潿維濰偉偽僞緯葦煒瑋諉韙鮪衛磑謂蝟溫轀鰮紋聞閿穩問鶲甕撾渦萵窩蝸臥齷烏汙鄔嗚誣鎢無吳蕪鵐塢嫵廡憮鵡務誤騖霧鶩誒餏犧錫習襲覡鰼璽銑戲屭係繫餼細郤綌鬩蝦俠峽狹硤轄嚇廈纖秈薟銛躚鍁鮮閑閒賢鹹撏嫻銜癇鷳獮顯險嶮獫蜆蘚縣峴莧現線綫憲餡羨獻鄉薌廂緗驤鑲詳響餉饗鯗項梟嘵驍綃鴞蕭銷瀟簫蠨囂曉嘯蠍協脅挾諧攜擷纈寫瀉紲褻謝鋅釁興騂陘鈃鉶訩洶詗鵂饈繡鏽銹須鬚頊虛諝噓許詡敘緒續漵軒諼懸選癬絢鉉鏇學澩鴬鱈謔勛勳塤尋馴詢潯鱘訓訊遜壓鴉椏鴨啞瘂亞訝埡婭掗氬懨煙閹訁閆嚴鹽閻顏顔兗儼厴魘黶鼴厭覎彥硯艷驗諺灩釅讞饜贗鴦揚陽暘楊煬瘍鍚颺養癢樣堯餚嶢軺窯謠搖遙瑤颻鰩藥鷂爺鋣業葉頁鄴曄燁謁饁靨醫禕銥鷖儀詒飴貽遺頤釔艤蟻義億憶藝議異囈譯嶧懌繹詣驛軼誼勩縊瘞鎰鷊鷁鐿陰蔭駰銦銀齗齦飲隱癮應鶯嬰緓鍈嚶攖纓罌櫻瓔鸚鷹塋滎熒瑩螢營縈瀅鎣瀠蠅贏潁頴穎癭喲傭擁癰鏞鱅顒詠湧踴鯒優憂猶郵蓧蕕鈾遊魷鮋銪誘紆於歟魚娛諛餘漁崳覦輿與傴嶼俁語鋙齬馭籲嫗飫鬱獄鈺預諭閾禦鵒澦蕷譽鷸鳶鴛淵鵷貟員園圓緣黿轅櫞遠願約嶽鑰悅鉞閱躍粵贇雲勻紜蕓鄖氳隕殞運鄆惲暈醞慍縕韞韻蘊臢雜災載攢趲暫贊鏨瓚贓駔髒臟鑿棗竈則擇澤責嘖幘簀賾賊鰂譖繒鋥贈摣齇紮劄軋閘鍘鮓鮺詐柵齋債氈譫鸇鱣斬颭盞嶄輾戰棧綻驏張漲帳脹賬釗詔趙輒蟄謫轍鍺這鷓貞針偵湞楨禎診軫縝陣紖鴆賑鎮爭徵崢掙猙鉦睜錚箏證諍鄭幀癥織梔執職縶躑衹隻紙軹誌製幟質櫛摯緻贄輊擲銍鷙滯騭觶躓終鐘鍾腫種眾衆謅譸輈鵃賙軸紂縐晝葤皺驟誅諸豬銖櫧瀦櫫燭屬囑矚佇紵苧註貯駐築鑄專磚顓轉囀賺饌妝莊樁裝壯狀騅錐墜綴縋贅諄準濁諑鐲茲貲資緇諮輜錙鎡齜鯔漬眥綜騌蹤總傯縱鄒騶諏鯫鏃詛組躦纘鑽鱒";

        char[] chars = simplified.toCharArray();

        Random random = new Random();
        StringBuilder s = new StringBuilder();
        for (int i = 0; i < count; i++) {
            String r = String.valueOf(chars[random.nextInt(chars.length)]);
            s.append(r);
        }
        return s.toString();

        /*StringBuilder s = new StringBuilder();
        for (int i = 0; i < count; i++) {
            String str = "";
            int highCode;
            int lowCode;

            Random random = new Random();

            //B0 + 0~39(16~55) 一级汉字所占区
            highCode = (176 + Math.abs(random.nextInt(39)));
            //A1 + 0~93 每区有94个汉字
            lowCode = (161 + Math.abs(random.nextInt(93)));

            byte[] b = new byte[2];
            b[0] = (Integer.valueOf(highCode)).byteValue();
            b[1] = (Integer.valueOf(lowCode)).byteValue();

            try {
                str = new String(b, "GBK");
                s.append(str);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return s.toString();*/
    }

    /**
     * 获取树节点名字
     * @param isShowCode 是否显示编码<br>
     * 		true or 1：显示在左侧：(id)name<br>
     * 		2：显示在右侧：name(id)<br>
     * 		false or null：不显示编码：name
     * @param code 编码
     * @param name 名称
     * @return
     */
	public static String getTreeNodeName(String isShowCode, String code, String name) {
		if ("true".equals(isShowCode) || "1".equals(isShowCode)) {
			return "(" + code + ") " + StringUtils.replace(name, " ", "");
		} else if ("2".equals(isShowCode)) {
			return StringUtils.replace(name, " ", "") + " (" + code + ")";
		} else {
			return StringUtils.replace(name, " ", "");
		}
	}

    public static boolean isContainChinese(String str) {
        Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
        Matcher m = p.matcher(str);
        if (m.find()) {
            return true;
        }
        return false;
    }
    /**
     * 提取字符串中的指定列值，英文逗号隔开
     * @param str
     * @param target
     * @return
     */
    public static String stringArryExtract(String str,String target){
        StringBuffer stringBuffer = new StringBuffer();
        JSONArray jsonArray = JSONArray.parseArray(str);
        for (int i = 0; i < jsonArray.size(); i++) {
            stringBuffer.append(jsonArray.getJSONObject(i).get(target) + (jsonArray.size()-i>1?",":""));
        }
        return stringBuffer.toString();
    }

    /**
     * 将true|false转换成1,0
     * @param str
     * @return
     */
    public static String parseBoolToInt(String str) {
        if(str.equalsIgnoreCase("true"))
            return "1";
        if(str.equalsIgnoreCase("false"))
            return "0";
        return str;
    }

//	/**
//	 * 测试代码
//	 * @param args
//	 */
	public static void main(String[] args) {
//		String html = "<p style=\"text-align: left; padding-bottom: 0px; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px 宋体, tahoma, arial, sans-serif; white-space: normal; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-stroke-width: 0px\">__eol__	科技日报讯&nbsp;（通讯员辛志向&nbsp;记者王建高）日前，青岛高新区国家级生态工业示范园区通过了由国家环保部及科技部、商务部三部门联合组织的国家正式验收。</p>__eol__<p style=\"text-align: left; padding-bottom: 0px; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px 宋体, tahoma, arial, sans-serif; white-space: normal; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-stroke-width: 0px\">__eol__	&nbsp;&nbsp;&nbsp;&nbsp;青岛市委常委、红岛经济区工委书记、管委主任陈飞介绍，建立国家生态工业示范园区是青岛高新区深化和拓展生态创建成果，加快结构调整，推进转型发展，进而辐射带动红岛经济区生态建设的重要抓手。</p>__eol__<p style=\"text-align: left; padding-bottom: 0px; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 0px; padding-left: 0px; letter-spacing: normal; padding-right: 0px; font: 14px/25px 宋体, tahoma, arial, sans-serif; white-space: normal; color: rgb(0,0,0); word-spacing: 0px; padding-top: 0px; -webkit-text-stroke-width: 0px\">__eol__	&nbsp;&nbsp;&nbsp;&nbsp;自2007年经国家三部委批准创建以来，青岛高新区高度重视，强化措施，始终按照创建工作要求，坚持生态、生活、生产&ldquo;三生共融&rdquo;理念，以生态环境的优化带动经济的发展。创建过程中，坚持&ldquo;科学性规划，高水平建设，生态化发展&rdquo;的原则，实施&ldquo;国际化、高端化、低碳化&rdquo;三大战略，逐步建立起适应循环经济发展的产业体系和政策体系，形成了完善的生态工业园建设框架和循环经济发展机制，实现了经济高速发展与环境持续改善的良性循环。随着发展环境和核心竞争力的不断提升，通过了ISO14001环境管理体系认证，获得了中国最具投资潜力经济园区、国家科技兴贸创新基地、山东省海外高层次人才创新创业基地等称号，在国家级高新区综合评价中连续多年跻身前列，已经成为山东半岛乃至环渤海区域快速成长、极具创新活力和竞争力的蓝色经济特色高科技产业园区。</p>";
//		html += "<div style=\"text-indent: 32pt\">__eol__	<span style=\"line-height: 20px; font-size: 20px\"><span style=\"font-family: 宋体\">我市积极支持和引导企业、高校院所&ldquo;走出去&rdquo;开展国际科技合作，在国外集聚和利用各种创新资源，增强我市企业和科研院所竞争实力。</span></span></div>__eol__<div align=\"left\" style=\"text-align: left; text-indent: 32pt; text-autospace: \">__eol__	<span style=\"line-height: 20px; font-size: 20px\"><span style=\"font-family: 宋体\">一是在国外设立研发中心。通过合资、并购、控股等方式，在国外设立研发中心和产业园，传播中国文化，提升青岛声誉。如，软控在斯洛伐克设立的研发中心成为我国与中东欧国家合作的成功样板。南车青岛四方积极筹建与泰国等高铁联合研发中心，将成为我国高端成套装备出口的重要研发基地。<span style=\"color: black\">2013</span><span style=\"color: black\">年，我市企业与大学科研机构与国外共建7家联合研发中心。 </span></span></span></div>__eol__<div style=\"text-indent: 32pt\">__eol__	<span style=\"line-height: 20px; font-size: 20px\"><span style=\"font-family: 宋体\"><span style=\"color: black\">二是利用科技资源和渠道助推中小科技企业&ldquo;走出去&rdquo;开发新兴市场。</span><span style=\"color: black\">利用尼日利亚总统访华契机，积极向尼方政府代表团推介我市现代农业技术和先进制造业企业。引导我市科技型企业输出技术，拓展西非共同体市场，推动企业转型升级，拓宽&ldquo;走出去&rdquo;渠道</span><span style=\"color: black\">。</span></span></span></div>";
//		html += "<p style='TEXT-ALIGN: center' class=\"sdfasf\"><strong>蓝海技术加以</strong></p><p style='TEXT-ALIGN: center'><em>蓝海技术加以</em></p><p style='TEXT-ALIGN: center'><span style='TEXT-DECORATION: underline'>蓝海技术加以</span></p><p style='TEXT-ALIGN: center'>蓝海技术加以</p><p></p>";
//		html = html.replaceAll("__eol__", "");
		System.out.println(underline2Camel("SP_NAME",true));
		System.out.println(underline2Camel("aa_a",true));
		System.out.println(camelToUnderline("aaA",1));
	}


    //驼峰转下划线
    public static String camelToUnderline(String param, Integer charType) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        int len = param.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = param.charAt(i);
            if (Character.isUpperCase(c)) {
                sb.append("_");
            }
            if (charType == 2) {
                sb.append(Character.toUpperCase(c));  //统一都转大写
            } else {
                sb.append(Character.toLowerCase(c));  //统一都转小写
            }


        }
        return sb.toString();
    }

    /**
     * 下划线转驼峰法
     * @param line 源字符串
     * @param smallCamel 大小驼峰,是否为小驼峰
     * @return 转换后的字符串
     */
    public static String underline2Camel(String line,boolean smallCamel){
        if(line==null||"".equals(line)){
            return "";
        }
        StringBuffer sb=new StringBuffer();
        Pattern pattern=Pattern.compile("([A-Za-z\\d]+)(_)?");
        Matcher matcher=pattern.matcher(line);
        while(matcher.find()){
            String word=matcher.group();
            sb.append(smallCamel&&matcher.start()==0?Character.toLowerCase(word.charAt(0)):Character.toUpperCase(word.charAt(0)));
            int index=word.lastIndexOf('_');
            if(index>0){
                sb.append(word.substring(1, index).toLowerCase());
            }else{
                sb.append(word.substring(1).toLowerCase());
            }
        }
        return sb.toString();
    }


    /**
     * 是否是json对象
     * @param   test 字符串
     * @return true:是
     */
    public final static boolean isJSONObject(String test) {
        try {
            JSONObject.parseObject(test);
        } catch (JSONException ex) {
            return false;
        }
        return true;
    }

    /**
     * 是否是json数组对象
     * @param   test 字符串
     * @return true:是
     */
    public final static boolean isJSONArray(String test) {
        try {
            JSONArray.parseArray(test);
        } catch (JSONException ex) {
            return false;
        }
        return true;
    }


    /**
    * @Description： 替换字符串前后中间所有的换行制表回车为 空字符串
    */
    public static String trimAll(String str) {
        String dest = "";
        if (str!=null) {
            Pattern p = Pattern.compile("\\s*|\t|\r|\n");
            Matcher m = p.matcher(str);
            dest = m.replaceAll("");
        }
        return dest;
    }

    /**
     * 生成一条新的Id
     * @return
     */
    public static String getIdStr() {
       return IdWorker.getIdStr();
    }

    /**
    * @Description： join 不排除掉元素中的null
    */
    public static String joinWithNull(List<String> list, String separator) {
        if (list == null) return  "";
        Iterator  iterator = list.iterator();
        if (iterator == null) {
            return null;
        } else if (!iterator.hasNext()) {
            return "";
        } else {
            Object first = iterator.next();
            if (!iterator.hasNext()) {
                return Objects.toString(first, "");
            } else {
                StringBuilder buf = new StringBuilder(256);
                if (first != null) {
                    buf.append(first);
                }

                while(iterator.hasNext()) {
                    if (separator != null) {
                        buf.append(separator);
                    }

                    Object obj = iterator.next();
                    buf.append(obj);
                }

                return buf.toString();
            }
        }
    }

    /**
     * @Description： aa.bb(true,null,111,"11") 获取俩括号中间的参数
     */
    public static Object[] getFunParam(String funStr) {
        if (StringUtils.isBlank(funStr) || funStr.indexOf("()") != -1) return null;
        if (funStr.indexOf("(") == -1 || funStr.indexOf("(") == funStr.lastIndexOf(")")) return null;
        String[] arr =  funStr.substring(funStr.indexOf("(")+1,funStr.lastIndexOf(")")).split(",");
        Object[] arrValue = new Object[arr.length];
        for(int i=0; i <arr.length ; i++) {
            if ("null".equals(arr[i]) || isAllBlank(arr[i])) {
                arrValue[i] = "";
            } else  if ("true".equals(arr[i]) || "false".equals(arr[i])) {
                arrValue[i] = Boolean.valueOf(arr[i]);
            }else{
                arrValue[i] = (Object)arr[i];
            }
        }
        return arrValue;
    }

    /**
     * bool类型的字符串转变成1，0
     * @param str
     * @return
     */
    public static Object boolParseToNumber(Object str) {
        if ("true".equalsIgnoreCase(str.toString())) {
            return "1";
        }
        if ("false".equalsIgnoreCase(str.toString())) {
            return "0";
        }
        return str;
    }

    /**
     * bool类型的字符串转变成1，0
     * @param list ['true','false'] 转换为 ['1','0']
     * @return
     */
    public static List<String> get10FromBoolean(List<String> list) {
        if (list == null || list.size() < 1) return list;
        List<String> listNew = new ArrayList<String>();
        for(int i=0; i < list.size(); i ++) {
            if ("true".equals(list.get(i))) {
                listNew.add("1");
            }else if ("false".equals(list.get(i))) {
                listNew.add("0");
            } else {
                listNew.add(list.get(i));
            }
        }
        return listNew;
    }

    //判断是否是英文
    public static boolean isEnglish(String charaString){
        return charaString.matches("^[a-zA-Z]*");
    }
	/**
	 * 判断字符串是否是乱码
	 *
	 * @param strName 字符串
	 * @return 是否是乱码
	 */
	public static boolean isMessyCode(String strName) {
		if (isBlank(strName)) {
			return false;
		}
		Pattern p = Pattern.compile("\\s*|t*|r*|n*");
		Matcher m = p.matcher(strName);
		String after = m.replaceAll("");//去重为空的情况
		String temp = after.replaceAll("\\p{P}", "");
		char[] ch = temp.trim().toCharArray();
		float chLength = ch.length;
		float count = 0;
		for (int i = 0; i < ch.length; i++) {
			char c = ch[i];
			if (!Character.isLetterOrDigit(c)) {
				if (!isChinese(c)) {
					count = count + 1;
				}
			}
		}
		float result = count / chLength;
		if (result > 0.4) {
			return true;
		} else {
			return false;
		}

	}


	/**
	 * 判断字符是否是中文
	 *
	 * @param c 字符
	 * @return 是否是中文
	 */
	public static boolean isChinese(char c) {
		Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
		if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
				|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
				|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
				|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
				|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
				|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
			return true;
		}
		return false;
	}

	/**
	 * 判断字符是否是中文
	 *
	 * @param c 字符
	 * @return 是否是中文
	 */
	public static String getChineseByUrlencode(String str) {
		// 编码后一样，说明没有编码
		if (URLEncodeUtil.encode(str).equals(str)) {
			return str;
		}
		return URLDecoder.decode(str, CharsetUtil.CHARSET_UTF_8);
	}


	/**
	 * 正则替换所有特殊字符
	 * @param orgStr
	 * @return
	 */
	public static String replaceSpecStr(String orgStr){
		if (null!=orgStr&&!"".equals(orgStr.trim())) {
			String regEx="[\\s~·`!！@#￥$%^……&*（()）\\-——\\-_=+【\\[\\]】｛{}｝\\|、\\\\；;：:‘'“”\"，,《<。.》>、/？?]";
			Pattern p = Pattern.compile(regEx);
			Matcher m = p.matcher(orgStr);
			return m.replaceAll("");
		}
		return null;
	}

	/**
	 * 判断是否相等，将替换特殊字符后进行判断
	 *
	 * @return true 相等
	 */
	public static Boolean equalsNoSpec(String str1,String str2) {
		if (isAllEmpty(str1, str2)) {
			return true;
		}
		if (isAnyBlank(str1, str2)) {
			return false;
		}
		return equals(replaceSpecStr(str1),replaceSpecStr(str2));
	}

	private static final Set<Object> TRUE_SET = CollUtil.newHashSet(new Object[]{"true","TRUE", "1", 1, true});
	/**
	 * @description: 转换成bool类型
	 * @param: 	valueStr 字符串
	 * @param: 	nullValue 为空时返回值
	 * @return:
	 * <pre>
	 *     返回true "true", "1","是"
	 * </pre>
	 **/
	public static boolean toBoolean(Object valueStr, boolean nullValue) {
		if (valueStr != null) {
			return TRUE_SET.contains(valueStr);
		} else {
			return nullValue;
		}
	}

}
